import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import random

# 设置随机种子保证可复现
np.random.seed(42)
random.seed(42)

# 生成100个SPU
spu_codes = [f"SPU{str(i).zfill(5)}" for i in range(1001, 1101)]

# 模拟基础日期（2023年）
base_date = datetime(2023, 1, 1)

# 定义节假日（春节、618、双11等）
holidays = {
    "春节": (datetime(2023, 1, 21), datetime(2023, 1, 27)),
    "618": (datetime(2023, 6, 18), datetime(2023, 6, 20)),
    "双11": (datetime(2023, 11, 11), datetime(2023, 11, 13))
}

# 生成每个SPU的基础数据
spu_data = []
for spu in spu_codes:
    # 上新前加购总数（幂律分布）
    before_new_total = int(np.random.pareto(1.5) * 500 + 100)

    # 上新日销量（与加购数相关，但有波动）
    new_sale_qty = int(before_new_total * (0.05 + np.random.uniform(0.02, 0.15)))

    # 随机分配上新日期（避开1月1日）
    launch_date = base_date + timedelta(days=np.random.randint(1, 364))

    spu_data.append({
        "spu_code": spu,
        "before_new_total": before_new_total,
        "new_sale_qty": new_sale_qty,
        "launch_date": launch_date
    })

# 创建完整数据集
all_data = []
for spu in spu_data:
    launch_date = spu["launch_date"]
    for day in range(0, 39):  # 0-13天
        date = launch_date + timedelta(days=day)
        day_of_week = date.weekday()

        # 基础销量模型（指数衰减）
        base_sale = spu["new_sale_qty"] * np.exp(-0.15 * day)

        # 周末效应（周末销量增加）
        if day_of_week >= 5:  # 周六、周日
            base_sale *= np.random.uniform(1.3, 1.5)

        # 节假日效应
        holiday_boost = 1.0
        for holiday, (start, end) in holidays.items():
            if start <= date <= end:
                holiday_boost = np.random.uniform(1.8, 3.0)
                break

        # 随机波动（±20%）
        random_factor = np.random.uniform(0.8, 1.2)

        # 最终销量计算
        sale_qty = int(base_sale * holiday_boost * random_factor)

        # 确保销量不为负
        sale_qty = max(1, sale_qty)

        # 特殊日期处理（双11爆发）
        if date == datetime(2023, 11, 11):
            sale_qty = int(sale_qty * np.random.uniform(5.0, 10.0))

        all_data.append({
            "spu_code": spu["spu_code"],
            "date": date.strftime("%Y-%m-%d"),
            "days_since_launch": day,
            "before_new_total": spu["before_new_total"],
            "new_sale_qty": spu["new_sale_qty"] if day == 0 else 0,
            "sale_qty": sale_qty
        })

# 创建DataFrame
df = pd.DataFrame(all_data)

# 添加少量异常值（模拟促销活动）
for _ in range(40):
    idx = np.random.randint(0, len(df))
    df.at[idx, "sale_qty"] = int(df.at[idx, "sale_qty"] * np.random.uniform(2.0, 5.0))

# 保存到CSV
df.to_csv("your_data.csv", index=False)
print("模拟数据已保存到 your_data.csv")
print(f"数据集大小: {len(df)} 行")
print(f"时间范围: {df['date'].min()} 至 {df['date'].max()}")